package DSENS;

import java.util.ArrayList;

/**
 *
 * @author filippo,teeteto
 */

public class TimeLine {

    /*Variabile di appoggio utilizzata nel metodo che restituisce l'evento successivo.
     * Essa rappresenta lo slot temporale attuale.
     */
    
    public ArrayList<TimeSlot> timeline; //Array degli slot temporali

    private int ts;

    public int getTs() {
        return ts;
    }

    public void addSlot () {
        timeline.add(new TimeSlot());
    }

    //Aggiunge un evento in un determinato slot temporale indicato dal parametro
    public void addEvent(int slot, Event event) {
        if (ts+slot<timeline.size())
            timeline.get(ts+slot).addEvent(event);
    }

    /*Ritorna l'evento successivo contenuto nella timeline*/
    public Event getEvent() {
        try{
        if (ts< timeline.size() && ts>-1)
        do{
                if(timeline.get(ts).hasNext()){//Controlla che lo slot temporale attuale non sia vuoto
                Event tmp = timeline.get(ts).getEvent();
                timeline.get(ts).te++;
                return tmp;

            }    //se lo slot non è vuoto, ritorna il prossimo evento.
            else//Lo slot temporale rappresentato da "ts" non ha altri eventi da processare, controlla allora che
                //l'iteratore degli slot temporali abbia ancora slot.
                if(this.hasNext()) //Se così è,
                    ts++;//assegna il prossimo slot a "ts".
                else ts = timeline.size();
        }
        while(ts < timeline.size());
        return null;
        }catch(Exception e){e.printStackTrace();
        return null;}
    }

    public boolean hasNext() {
            if(this.ts >= timeline.size()) return false;
            else return true;
    }

    //Costruttore
    public TimeLine(int numOfSlot) {
        this.timeline = new ArrayList<TimeSlot>(numOfSlot);
        for(int i = 0; i < numOfSlot; i++)
            timeline.add(new TimeSlot());
        ts = 0;
    }
/*****Definizione classe che rappresenta lo slot temporale*******/
    public class TimeSlot {

        private int te;
        public ArrayList<Event> slot;//Array di eventi

        public Event getEvent() {
            if (te<slot.size())
                return slot.get(te);
            else return null;
        }

        public void addEvent(Event e) {
            slot.add(e);
        }

        public boolean hasNext() {
            if(this.te == slot.size()) return false;
            else return true;
        }

        //Costruttore
        public TimeSlot() {
            te=0;
            this.slot = new ArrayList<Event>();
        }
    }
    /**********Fine definizione classe slot temporale*********/
}
